package com.birdboot.core;

import com.birdboot.http.HttpServletRequest;

import java.io.*;
import java.net.Socket;
import java.net.URISyntaxException;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;

/*
* 该线程任务负责与指定的客户端进行HTTP交互
* HTTP协议要求浏览器与服务端采取“一问一答”的模式。对此，这里的处理流程分为三步：
* 1.解析请求
* 2.处理请求
* 3.发送请求
* */
public class ClientHandler implements Runnable {
    private Socket socket;
    //ClientHandler new的时候执行构造函数 复制给线程的属性，run方法就可以用了，传参的小方法
    public ClientHandler(Socket socket){
        this.socket = socket;
    }
    @Override
    public void run() {
        try {
            /*
            * 1. 解析请求
            *
            * */
            HttpServletRequest request = new HttpServletRequest(socket);
            String path = request.getUrl();
            System.out.println(path);
            //3.发送响应
            /*
            * V5的第一个测试小目标：将static目录下的index.html页面发送给浏览器
            * 相对路径中非常重要的一个：类加载路径
            * 是我们项目中任何一个类(该类的class文件)所在包的顶级包的上一层目录就是类加载路径
            * 如果使用File去定位该目录，格式是固定的
            * File dir = new File(
            *   当前类名.class.getClassLoader().getResource(".").toURI()
            * )
            * D:\study\BirdBoot2303\V5\target\classes
            * 以在当前类ClientHandler中使用为例：
            * ClientHandler所在的包：com.birdboot.core。该包的顶层包是com.
            * 此时加类加载路径就是指com所在的目录
            * 在当前项目中代码编译后，src/main/java中所有的java类都会编译后放到该目录的target/classes目录中。而src/main/resources下的静态资源也会放到target/classes目录中
            * 而com目录就是放到了target/classes中，因此该目录就是类加载路径
            * 从该路径能看出，只要定位到他，就可以顺着该目录找到所有的java类以及所有的静态资源
            * HTTP/1.1 200 OK
            * Content-Type: text/html(CRLF)
            * Content-length: 2546(CRLF)(CRLF)
            * */
            try {
                File baseDir = new File(ClientHandler.class.getClassLoader().getResource(".").toURI());
                File staticDir = new File(baseDir,"static");
                /*
                * V5的第二个测试目标：根据浏览器输入的抽象路径去定位static下的资源并将其发送给浏览器
                * */
                File file = new File(staticDir,path);
                println("HTTP/1.1 200 OK");
                println("Content-Type: text/html");
                println("Content-length: "+file.length());
                //单独发送回车换行
                println("");
                FileInputStream fis = new FileInputStream(file);
                OutputStream out = socket.getOutputStream();
                byte[] buf = new byte[1024*10];
                int d;
                while ((d=fis.read(buf))!=-1){
                    out.write(buf,0,d);
                }
            } catch (URISyntaxException e) {
                e.printStackTrace();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    /*向客户发送一行字符串*/
    private void println(String line) throws IOException {
        OutputStream out = socket.getOutputStream();
        byte data[] = line.getBytes(StandardCharsets.ISO_8859_1);
        out.write(data);
        out.write(13);
        out.write(10);
    }
    public static void main(String[] args) {
//        try {
//            File baseDir = new File(ClientHandler.class.getClassLoader().getResource(".").toURI());
//            System.out.println(baseDir);
//            File staticDir = new File(baseDir,"static");
//            File file = new File(staticDir,"index.html");
//            System.out.println(file.exists());
//        } catch (URISyntaxException e) {
//            e.printStackTrace();
//        }
    }
}
